package LearnAlgorithm.f_字符串;
/*
请编写1个方法，将字符串中的空格全部替换为“%20”。
假定该字符串有足够的空间存放新增的字符,
并且知道字符串的真实长度(小于等于1000)，同时保证字符串由大小写的英文字母组成
给定一个String iniString为原始的串，以及串的长度int len，返回替换后的String newstring
测试样例:
"Mr John Smith”, 13
返回: 
"Mr%20John%20Smith”
"Hello  World", 12
返回: 
"Hello%20%20World"
 */
public class d替换单个字符串的所有空格为指定字符 {
	public static void main(String[] args) {
		String s1 = "Hello  World";
		String s2 = "Mr John Smith";
		System.out.println(replaceSpaceApi(s1, s1.length()));
		char[] s3Arr = new char[40];
		s3Arr[0] = 'M';
		s3Arr[1] = 'r';
		s3Arr[2] = ' ';
		s3Arr[3] = 'J';
		s3Arr[4] = 'o';
		s3Arr[5] = 'h';
		s3Arr[6] = 'n';
		s3Arr[7] = ' ';
		s3Arr[8] = 'S';
		s3Arr[9] = 'm';
		s3Arr[10] = 'i';
		s3Arr[11] = 't';
		s3Arr[12] = 'h';
		String s3 = new String(s3Arr);
		System.out.println(replacrSpaceByAscll(s3.toCharArray(), 13));
	}
	
	/**
	 * O(N)
	 * @param string
	 * @param length
	 * @return
	 */
	public static String replaceSpaceApi(String string, int length) {
		return string.replaceAll("\\s", "%20");//%20是指定字符
	}
	
	/**
	 * 不会出现后指针顶到了前指针前面
	 * 不会出现各种意外错误
	 * 这是经过老师思想和3月1日自己思考后的正确的代码
	 * 
	 * 足够大空间的长度=s3.length()
	 * 需要的足够大空间的长度=(13 + 4)
	 * 有效字符的长度=13
	 * O(N)
	 * @param arr
	 * @param length
	 * @return
	 */
	public static String replacrSpaceByAscll(char[] arr, int length) {//length是字符串有效字符的最大长度
		int count = length;//定义“需要的足够大空间”的长度
		for (int i = 0; i < length; i++) {//循环遍历字符串所有的有效字符
			if (arr[i] == ' ') {
				count += 2;
			}
		}
		int p1 = length - 1;//定义指向字符串的有效字符最后一位的指针；前指针
		int p2 = count - 1;//定义指向“需要的足够大空间”的最后一位指针；后指针
		while (p1 >= 0) {//循环遍历字符串所有的有效字符
			if (arr[p1] == ' ') {//前指针遇到空格
				arr[p2--] = '0';//后指针追加替换空格的字符
				arr[p2--] = '2';
				arr[p2--] = '%';
			} else {//前指针遇到普通字符
				arr[p2--] = arr[p1];//后指针追加对应字符
			}
			p1--;//前指针前移
		}
		return new String(arr,0,count);//从0索引到count-1索引
	}
}
